package org.xianyu.service;


import org.springframework.stereotype.Service;
import org.xianyu.commom.PageResult;
import org.xianyu.domain.entity.Order;
import org.xianyu.domain.enums.OrderStatus;
import org.xianyu.mapper.OrderMapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 订单服务类，提供订单的增删改查功能
 */
@Service
public class OrderService {
    private final OrderMapper mapper;

    public OrderService(OrderMapper mapper) {
        this.mapper = mapper;
    }

    /**
     * 根据ID获取订单信息
     * @param id 订单ID
     * @return 订单对象，如果不存在则返回null
     */
    public Order getById(Long id) {
        return mapper.selectById(id);
    }

    /**
     * 查询订单列表，支持按产品名称、订单状态筛选，以及排序
     * @param product 产品名称，用于模糊查询
     * @param status 订单状态，用于精确筛选
     * @param sortBy 排序字段，可选值：price, profit, order_time, end_time
     * @param sortDir 排序方向，可选值：asc, desc
     * @return 订单列表
     */
    public List<Order> list(String product, OrderStatus status, String sortBy, String sortDir) {
        // sortBy 使用后端允许的字段：price, profit, order_time, end_time
        return mapper.selectAll(product, status, sortBy, sortDir);
    }

    /**
     * 创建新订单
     * @param order 待创建的订单对象
     * @return 创建成功的订单对象
     */
    public Order create(Order order) {
        mapper.insert(order);
        return order;
    }

    /**
     * 更新订单信息
     * @param order 待更新的订单对象
     * @return 受影响的记录数
     */
    public int update(Order order) {
        return mapper.update(order);
    }

    /**
     * 根据ID删除订单
     * @param id 订单ID
     * @return 受影响的记录数
     */
    public int delete(Long id) {
        return mapper.delete(id);
    }



    /**
     * 分页查询并返回 PageResult
     * page: 从 1 开始
     */
    public PageResult<Order> page(String product, OrderStatus status, String sortBy, String sortDir, int page, int size) {
        if (page < 1) page = 1;
        if (size < 1) size = 10;
        int offset = (page - 1) * size;

        long total = mapper.count(product, status);
        List<Order> rows = mapper.selectPage(product, status, sortBy, sortDir, offset, size);
        return new PageResult<>(total, page, size, rows);
    }


    /**
     * 统计在 [start, end] 结束时间范围内，且状态为 status 的金额总和。
     * 返回 BigDecimal，若数据库返回 null 则转换为 BigDecimal.ZERO。
     */
    public BigDecimal sumProfitByEndTimeAndStatus(Date start, Date end, OrderStatus status) {
        BigDecimal v = mapper.sumProfitByEndTimeAndStatus(start, end, status);
        return v == null ? BigDecimal.ZERO : v;
    }

    /**
     * 统计所有下单订单的价格总和（SUM(price)）。
     */
    public BigDecimal sumAllPrice() {
        BigDecimal v = mapper.sumAllPrice();
        return v == null ? BigDecimal.ZERO : v;
    }
}

